#:  -*- coding: utf-8 -*-
import time
import traceback

from chanlun import fun
from chanlun.cl_interface import *
from chanlun.exchange.exchange_tdx import ExchangeTDX
from chanlun.strategy.strategy_xd_mmd import StrategyXDMMD
from chanlun.trader.online_market_datas import OnlineMarketDatas
from chanlun.trader.trader_a_stock import TraderAStock

"""
运行依赖 futuOpenD
"""

logger = fun.get_logger('./logs/trader_a_stock.log')

logger.info('沪深自动化交易程序')

try:
    run_codes = ["SZ.000001", "SZ.000002", "SZ.000009", "SZ.000027", "SZ.000039", "SZ.000050", "SZ.000063", "SZ.000066",
                 "SZ.000069", "SZ.000100", "SZ.000155", "SZ.000157", "SZ.000166", "SZ.000301", "SZ.000333", "SZ.000338",
                 "SZ.000401", "SZ.000425", "SZ.000513", "SZ.000519", "SZ.000537", "SZ.000538", "SZ.000539", "SZ.000553",
                 "SZ.000568", "SZ.000581", "SZ.000591", "SZ.000596", "SZ.000617", "SZ.000625", "SZ.000629", "SZ.000630",
                 "SZ.000651", "SZ.000656", "SZ.000661", "SZ.000683", "SZ.000703", "SZ.000708", "SZ.000709", "SZ.000723",
                 "SZ.000725", "SZ.000728", "SZ.000733", "SZ.000738", "SZ.000739", "SZ.000768", "SZ.000776", "SZ.000783",
                 "SZ.000785", "SZ.000786", "SZ.000792", "SZ.000799", "SZ.000800", "SZ.000807", "SZ.000825", "SZ.000830",
                 "SZ.000831", "SZ.000858", "SZ.000876", "SZ.000877", "SZ.000883", "SZ.000893", "SZ.000895", "SZ.000898",
                 "SZ.000902", "SZ.000932", "SZ.000933", "SZ.000937", "SZ.000938", "SZ.000958", "SZ.000959", "SZ.000960",
                 "SZ.000963", "SZ.000975", "SZ.000977", "SZ.000983", "SZ.000987", "SZ.000998", "SZ.000999", "SZ.001965",
                 "SZ.001979", "SZ.002001", "SZ.002007", "SZ.002008", "SZ.002013", "SZ.002015", "SZ.002024", "SZ.002025",
                 "SZ.002027", "SZ.002028", "SZ.002030", "SZ.002032", "SZ.002049", "SZ.002050", "SZ.002056", "SZ.002064",
                 "SZ.002074", "SZ.002078", "SZ.002080", "SZ.002120", "SZ.002128", "SZ.002129", "SZ.002138", "SZ.002142",
                 "SZ.002152", "SZ.002153", "SZ.002176", "SZ.002179", "SZ.002180", "SZ.002185", "SZ.002192", "SZ.002202",
                 "SZ.002223", "SZ.002230", "SZ.002236", "SZ.002240", "SZ.002241", "SZ.002244", "SZ.002252", "SZ.002266",
                 "SZ.002268", "SZ.002271", "SZ.002294", "SZ.002299", "SZ.002304", "SZ.002311", "SZ.002326", "SZ.002340",
                 "SZ.002352", "SZ.002353", "SZ.002371", "SZ.002372", "SZ.002384", "SZ.002385", "SZ.002405", "SZ.002407",
                 "SZ.002408", "SZ.002409", "SZ.002410", "SZ.002414", "SZ.002415", "SZ.002422", "SZ.002430", "SZ.002459",
                 "SZ.002460", "SZ.002463", "SZ.002465", "SZ.002466", "SZ.002475", "SZ.002493", "SZ.002497", "SZ.002507",
                 "SZ.002508", "SZ.002532", "SZ.002555", "SZ.002557", "SZ.002568", "SZ.002594", "SZ.002597", "SZ.002600",
                 "SZ.002601", "SZ.002602", "SZ.002603", "SZ.002607", "SZ.002624", "SZ.002625", "SZ.002648", "SZ.002673",
                 "SZ.002709", "SZ.002714", "SZ.002736", "SZ.002738", "SZ.002756", "SZ.002791", "SZ.002797", "SZ.002812",
                 "SZ.002821", "SZ.002831", "SZ.002841", "SZ.002850", "SZ.002916", "SZ.002920", "SZ.002936", "SZ.002938",
                 "SZ.002939", "SZ.002945", "SZ.002948", "SZ.002966", "SZ.003022", "SZ.003035", "SZ.003816", "SZ.300012",
                 "SZ.300014", "SZ.300015", "SZ.300033", "SZ.300037", "SZ.300059", "SZ.300073", "SZ.300122", "SZ.300142",
                 "SZ.300144", "SZ.300146", "SZ.300171", "SZ.300207", "SZ.300223", "SZ.300251", "SZ.300274", "SZ.300285",
                 "SZ.300308", "SZ.300316", "SZ.300347", "SZ.300357", "SZ.300363", "SZ.300373", "SZ.300390", "SZ.300413",
                 "SZ.300450", "SZ.300454", "SZ.300496", "SZ.300529", "SZ.300568", "SZ.300595", "SZ.300601", "SZ.300628",
                 "SZ.300661", "SZ.300676", "SZ.300682", "SZ.300699", "SZ.300726", "SZ.300759", "SZ.300760", "SZ.300763",
                 "SZ.300769", "SZ.300776", "SZ.300777", "SZ.300782", "SZ.300832", "SZ.300850", "SZ.300861", "SZ.300888",
                 "SZ.300896", "SZ.300919", "SZ.300957", "SZ.300979", "SH.600000", "SH.600004", "SH.600008", "SH.600009",
                 "SH.600010", "SH.600011", "SH.600015", "SH.600016", "SH.600018", "SH.600019", "SH.600021", "SH.600025",
                 "SH.600026", "SH.600027", "SH.600028", "SH.600029", "SH.600030", "SH.600031", "SH.600036", "SH.600038",
                 "SH.600039", "SH.600048", "SH.600050", "SH.600056", "SH.600061", "SH.600062", "SH.600079", "SH.600085",
                 "SH.600089", "SH.600104", "SH.600109", "SH.600111", "SH.600115", "SH.600118", "SH.600132", "SH.600141",
                 "SH.600143", "SH.600150", "SH.600153", "SH.600160", "SH.600161", "SH.600170", "SH.600176", "SH.600177",
                 "SH.600183", "SH.600188", "SH.600196", "SH.600208", "SH.600219", "SH.600233", "SH.600236", "SH.600248",
                 "SH.600256", "SH.600258", "SH.600276", "SH.600282", "SH.600295", "SH.600298", "SH.600299", "SH.600309",
                 "SH.600315", "SH.600332", "SH.600346", "SH.600348", "SH.600350", "SH.600352", "SH.600362", "SH.600369",
                 "SH.600372", "SH.600377", "SH.600378", "SH.600380", "SH.600383", "SH.600392", "SH.600398", "SH.600406",
                 "SH.600415", "SH.600426", "SH.600436", "SH.600438", "SH.600456", "SH.600460", "SH.600483", "SH.600486",
                 "SH.600487", "SH.600489", "SH.600499", "SH.600511", "SH.600516", "SH.600519", "SH.600521", "SH.600522",
                 "SH.600547", "SH.600548", "SH.600549", "SH.600563", "SH.600566", "SH.600570", "SH.600584", "SH.600585",
                 "SH.600588", "SH.600598", "SH.600600", "SH.600606", "SH.600612", "SH.600637", "SH.600642", "SH.600655",
                 "SH.600660", "SH.600663", "SH.600674", "SH.600688", "SH.600690", "SH.600702", "SH.600703", "SH.600704",
                 "SH.600705", "SH.600739", "SH.600741", "SH.600745", "SH.600754", "SH.600760", "SH.600763", "SH.600765",
                 "SH.600779", "SH.600795", "SH.600801", "SH.600803", "SH.600808", "SH.600809", "SH.600837", "SH.600845",
                 "SH.600848", "SH.600859", "SH.600862", "SH.600863", "SH.600867", "SH.600871", "SH.600873", "SH.600875",
                 "SH.600884", "SH.600885", "SH.600886", "SH.600887", "SH.600893", "SH.600900", "SH.600905", "SH.600909",
                 "SH.600918", "SH.600919", "SH.600926", "SH.600956", "SH.600958", "SH.600968", "SH.600985", "SH.600988",
                 "SH.600989", "SH.600998", "SH.600999", "SH.601001", "SH.601006", "SH.601009", "SH.601012", "SH.601016",
                 "SH.601018", "SH.601021", "SH.601058", "SH.601066", "SH.601077", "SH.601088", "SH.601100", "SH.601108",
                 "SH.601111", "SH.601117", "SH.601128", "SH.601138", "SH.601155", "SH.601156", "SH.601158", "SH.601162",
                 "SH.601166", "SH.601168", "SH.601169", "SH.601186", "SH.601198", "SH.601211", "SH.601216", "SH.601225",
                 "SH.601229", "SH.601231", "SH.601233", "SH.601236", "SH.601238", "SH.601288", "SH.601298", "SH.601318",
                 "SH.601319", "SH.601328", "SH.601336", "SH.601360", "SH.601377", "SH.601390", "SH.601398", "SH.601456",
                 "SH.601555", "SH.601577", "SH.601598", "SH.601600", "SH.601601", "SH.601607", "SH.601615", "SH.601618",
                 "SH.601628", "SH.601633", "SH.601636", "SH.601658", "SH.601665", "SH.601666", "SH.601668", "SH.601669",
                 "SH.601677", "SH.601688", "SH.601689", "SH.601696", "SH.601699", "SH.601717", "SH.601727", "SH.601766",
                 "SH.601788", "SH.601799", "SH.601800", "SH.601808", "SH.601816", "SH.601818", "SH.601828", "SH.601838",
                 "SH.601857", "SH.601865", "SH.601866", "SH.601872", "SH.601877", "SH.601878", "SH.601880", "SH.601881",
                 "SH.601888", "SH.601898", "SH.601899", "SH.601901", "SH.601916", "SH.601919", "SH.601933", "SH.601939",
                 "SH.601958", "SH.601963", "SH.601966", "SH.601985", "SH.601988", "SH.601989", "SH.601990", "SH.601991",
                 "SH.601992", "SH.601995", "SH.601997", "SH.601998", "SH.603019", "SH.603077", "SH.603087", "SH.603127",
                 "SH.603160", "SH.603185", "SH.603195", "SH.603198", "SH.603229", "SH.603233", "SH.603236", "SH.603259",
                 "SH.603260", "SH.603267", "SH.603288", "SH.603290", "SH.603345", "SH.603369", "SH.603392", "SH.603444",
                 "SH.603456", "SH.603486", "SH.603501", "SH.603517", "SH.603565", "SH.603568", "SH.603589", "SH.603596",
                 "SH.603605", "SH.603606", "SH.603613", "SH.603658", "SH.603659", "SH.603688", "SH.603707", "SH.603712",
                 "SH.603737", "SH.603799", "SH.603806", "SH.603816", "SH.603833", "SH.603858", "SH.603868", "SH.603882",
                 "SH.603885", "SH.603893", "SH.603899", "SH.603939", "SH.603986", "SH.603993", "SH.605117", "SH.605358",
                 "SH.605499", "SH.688005", "SH.688008", "SH.688009", "SH.688012", "SH.688036", "SH.688099", "SH.688111",
                 "SH.688116", "SH.688122", "SH.688126", "SH.688139", "SH.688169", "SH.688180", "SH.688185", "SH.688188",
                 "SH.688202", "SH.688298", "SH.688301", "SH.688363", "SH.688385", "SH.688396", "SH.688516", "SH.688536",
                 "SH.688599", "SH.688690", "SH.688798", "SH.688981"]

    logger.info('Run symbols:  %s' % run_codes)

    frequencys = ['d']

    cl_config = {
        # 分型默认配置
        'fx_qj': Config.FX_QJ_K.value,
        'fx_bh': Config.FX_BH_YES.value,
        # 笔默认配置
        'bi_type': Config.BI_TYPE_NEW.value,
        'bi_bzh': Config.BI_BZH_YES.value,
        'bi_fx_cgd': Config.BI_FX_CHD_NO.value,
        'bi_qj': Config.BI_QJ_DD.value,
        # 线段默认配置
        'xd_bzh': Config.XD_BZH_NO.value,
        'xd_qj': Config.XD_QJ_DD.value,
        # 走势段默认配置
        'zsd_bzh': Config.ZSD_BZH_NO.value,
        'zsd_qj': Config.ZSD_QJ_DD.value,
        # 中枢默认配置
        'zs_bi_type': Config.ZS_TYPE_DN.value,  # 笔中枢类型
        'zs_xd_type': Config.ZS_TYPE_DN.value,  # 走势中枢类型
        'zs_qj': Config.ZS_QJ_CK.value,
        'zs_wzgx': Config.ZS_WZGX_ZGD.value,
    }

    code_cl_datas = {}

    p_redis_key = 'trader_a_stock'

    # 交易所对象
    ex = ExchangeTDX()
    # 交易对象
    TR = TraderAStock('AStock', log=logger.info)
    # 行情数据对象
    Data = OnlineMarketDatas('a', frequencys, ex, cl_config)
    # 从 redis 中加载数据
    TR.load_from_redis(p_redis_key)
    # 策略
    STR = StrategyXDMMD()
    # 将策略与数据对象加入到交易对象中
    TR.set_strategy(STR)
    TR.set_data(Data)

    while True:
        try:
            seconds = int(time.time())

            if seconds % (30 * 60) != 0:
                time.sleep(1)
                continue

            # 判断是否是交易时间
            if ex.now_trading() is False:
                continue

            # 增加当前持仓中的交易对儿
            run_codes = TR.position_codes() + run_codes
            run_codes = list(set(run_codes))

            for code in run_codes:
                try:
                    TR.run(code)
                except Exception as e:
                    logger.error(traceback.format_exc())

            # 清空之前获取的k线缓存，避免后续无法获取最新数据
            Data.clear_cache()

            # 保存交易数据到 Redis 中
            TR.save_to_redis(p_redis_key)

        except Exception as e:
            logger.error(traceback.format_exc())

except Exception as e:
    logger.error(traceback.format_exc())
finally:
    logger.info('Done')
